/**
 * @file main.c
 * @brief MPU6050综合示例 - 实时显示加速度、陀螺仪和温度数据
 * @note 使用BSP库中的MPU6050驱动
 */

#include "config.h"
#include <stdio.h>

int main(void)
{
	System_init();

#ifdef DEBUG
#include <assert.h>
	assert(DL_GPIO_isReset(LED_PORT));
	assert(DL_GPIO_isPowerEnabled(LED_PORT));
#endif

	set_systick_ms(1);
	
	// 初始化OLED
	OLED_Init();
	delay_ms(100);
	OLED_ClearBuffer();
	
	// 显示标题
	OLED_DrawString(0, 0, "MPU6050 Sensor", 1);
	
	// 初始化MPU6050
	if (!MPU6050_Init()) {
		OLED_DrawString(0, 16, "Init Failed!", 1);
		while (1) {
			DL_GPIO_togglePins(LED_PORT, LED_PIN_0_PIN);
			delay_ms(100);  // 快速闪烁表示错误
		}
	}
	
	// 配置传感器量程
	MPU6050_SetGyroFS(MPU6050_GYRO_FS_500);    // ±500°/s
	MPU6050_SetAccelFS(MPU6050_ACCEL_FS_4G);   // ±4g
	MPU6050_SetDLPF(MPU6050_DLPF_94HZ);        // 94Hz低通滤波
	
	OLED_DrawString(0, 16, "Ready!", 1);
	delay_ms(500);
	
	// 传感器数据
	MPU6050_Data_t accel, gyro;
	float temp;
	char buf[32];
	
	while (1)
	{
		// 读取所有传感器数据（一次性读取更高效）
		MPU6050_ReadAll(&accel, &gyro, &temp);
		
		// 清除显示缓冲区
		memset(buf, 0x00, 32);
		OLED_ClearBuffer();
		
		// 显示加速度数据 (原始值，减少浮点运算)
		OLED_DrawString(0, 0, "Accel:", 1);
		sprintf(buf, "X:%d", accel.x);
		OLED_DrawString(0, 12, buf, 1);
		sprintf(buf, "Y:%d", accel.y);
		OLED_DrawString(0, 22, buf, 1);
		sprintf(buf, "Z:%d", accel.z);
		OLED_DrawString(0, 32, buf, 1);
		
		// 显示陀螺仪数据 (原始值)
		OLED_DrawString(64, 0, "Gyro:", 1);
		sprintf(buf, "X:%d", gyro.x);
		OLED_DrawString(64, 12, buf, 1);
		sprintf(buf, "Y:%d", gyro.y);
		OLED_DrawString(64, 22, buf, 1);
		sprintf(buf, "Z:%d", gyro.z);
		OLED_DrawString(64, 32, buf, 1);
		// 显示温度 (整数部分)
		sprintf(buf, "T:%dC", (uint8_t)temp);
		OLED_DrawString(0, 48, buf, 1);

		// LED闪烁表示数据更新
		DL_GPIO_togglePins(LED_PORT, LED_PIN_0_PIN);
		
		// 更新频率约10Hz
		delay_ms(100);
	}

	return 0;
}
